Here we model an intervention to improve food environments and address malnutrition among school-aged children in urban Hanoi. The intervention is formulated as a decision model with five options:
Conceptually the food environment is described in the following figure. The circles with the dotted lines are external or underlying factors.
We express the general concept of the food environment is slightly differently when we describe it in the context of an intervention. In this figure we show that both the garden products and the education program of a school garden are expected to influence the food environment and how this is expected to happen. The garden itself may have a direct effect if it produces fruits and vegetables that are consumed by students. The garden may also effect the food environments of children by influencing their knowledge about and desire for healthy foods, including fruits and vegetables. The education that students receive may change their perception, make them willing to pay, and also increase their access to fresh fruits and vegetables. Several other expected effects are also included in the figure.
Conceptual model of how school gardens in urban Hanoi schools could influence the food environments of children.
The gardens will be created in existing land that is available on school grounds. In the the STEM (Science Technology Education and Math) alternative, the gardens will be designed for teaching about nutrition and STEM (an approach to learning and development that integrates science, technology, engineering and maths) at primary and secondary schools.
The model was developed across several iterative workshops in July 2023. These included decision definition, conceptual model development of the selected decision and an initial programming session with preliminary model results. The resulting model was further developed through August to November 2023.
Conceptual model of school gardens as an intervention. Should urban Hanoi school boards invest time and money in creating school gardens? Should they invest in formal STEM education as part of these gardens?
No garden
Here we model the baseline of not having a garden. There are some advantages to this including additional play area for kids and the possibilility of other uses for the space such as parking when school is not in session.
School garden
This intervention involves establishing a garden with a dual focus on gardening education. The initiative encompasses the financial aspects of compost, livestock, garden design, equipment, and construction costs. Establishment costs are allocated for compost initiation, worm maintenance, introducing small animals, hiring a planner for garden design, and acquiring necessary equipment, including potential smart systems. The focus extends from enriching soil quality to creating an aesthetically pleasing and functionally equipped garden
School garden designed to contribute to teaching Science Technology Education and Maths (STEM)
In this option we integrate a focus on sciences and STEM education into the garden. Integrating STEM education through the provision of specialized teaching equipment and training for teachers. Establishment costs include science-oriented teaching equipment, with a focus on practical tools like microscopes. Teachers need training for gardening and STEM topics spanning 5 to 7 subjects over 12 days. The intervention aims to not only create a sustainable and interactive garden space but also to enhance educational experiences by incorporating science-oriented learning.
School garden implementation and monitoring
We want to test our uncertainty here and get as much additional information as we can to better understand the complexity of effects of school gardens on the food environments children. A test run of the intervention, in the form of an actual school garden on school property, will be carried out by the Center for the Development of Organic Agriculture (CODAS) under the Association of Organic Agriculture of Vietnam. In the 2nd year the garden is expected to start running well. The 3rd year is when the STEM education plan will be fully running.
Here is our simulation of the school garden intervention options.
# Source our model
source("CODAS_Garden_Model.R")
# Ensure consistent results with the random number generator
# not for each 'run' of the MC simulation but for
# consistency each time we call on the simulation
set.seed(1234)
garden_simulation_results <- mcSimulation(
estimate = estimate_read_csv("inputs_school_garden.csv"),
model_function = school_garden_function,
numberOfModelRuns = 1000, #run 1000 times
functionSyntax = "plainNames"
)
Here is a plot of the Net Present Value (i.e. current value of the future benefits) of the garden decision options over 5 years of the intervention. For public and private schools the STEM costs are considered to be in the same garden space but with the additional costs and benefits of a full STEM education program. All options are compared to the same years of using the land for something that is not related to the garden, i.e. as a playground or for parking. Here we plot the distribution for the decision and frame the projected NPV.
source("functions/plot_distributions.R")
plot_distributions(mcSimulation_object = garden_simulation_results,
vars = c("decision_garden","decision_STEM", "decision_garden_public_school", "decision_garden_STEM_public_school"),
method = 'smooth_simple_overlay',
base_size = 7,
x_axis_name = "Comparative NPV outcomes")
This may be easier to see as a boxplot:
source("functions/plot_distributions.R")
plot_distributions(mcSimulation_object = garden_simulation_results,
vars = c("decision_garden","decision_STEM", "decision_garden_public_school", "decision_garden_STEM_public_school"),
method = "boxplot",
base_size = 7,
x_axis_name = "Comparative NPV outcomes")
summary(garden_simulation_results$y$decision_garden)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -737.4 742.4 1438.2 1731.9 2452.1 7964.7
Summary of the savings for the formal STEM education garden option
summary(garden_simulation_results$y$decision_STEM)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -2330.6 275.3 953.6 1193.4 1819.3 8123.9
summary(garden_simulation_results$y$total_costs)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 89.22 198.90 428.35 389.19 503.88 1163.78
summary(garden_simulation_results$y$total_costs_STEM)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 153.9 356.0 818.8 908.0 1235.6 5807.1
summary(garden_simulation_results$y$Cashflow_garden1)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -270.40 75.71 212.72 264.73 400.07 1495.93
summary(garden_simulation_results$y$Cashflow_garden_STEM1)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -691.79 -90.79 43.09 79.96 208.22 1419.72
Here we assess value of information with the multi_EVPI
function.
# Subset the outputs from the mcSimulation function (y) by selecting the correct variables be sure to run the multi_EVPI only on the variables that we want. Find them with names(garden_simulation_results$y)
mcSimulation_table <- data.frame(garden_simulation_results$x,
garden_simulation_results$y[1:9])
Value of information for the garden option (no STEM)
source("functions/multi_EVPI.R")
# first_out_var is the first result variable in the table, "NPV_garden" in our case.
# names(garden_simulation_results$y)
evpi <- multi_EVPI(mc = mcSimulation_table, first_out_var = "NPV_garden")
## [1] "Processing 9 output variables. This can take some time."
## [1] "Output variable 1 (NPV_garden) completed."
## [1] "Output variable 2 (NPV_garden_STEM) completed."
## [1] "Output variable 3 (NPV_no_garden) completed."
## [1] "Output variable 4 (NPV_garden_public_school) completed."
## [1] "Output variable 5 (NPV_garden_STEM_public_school) completed."
## [1] "Output variable 6 (decision_garden) completed."
## [1] "Output variable 7 (decision_STEM) completed."
## [1] "Output variable 8 (decision_garden_public_school) completed."
## [1] "Output variable 9 (decision_garden_STEM_public_school) completed."
Value of information the garden intervention decision
source("functions/plot_evpi.R")
plot_evpi(evpi, decision_vars = "decision_garden")
## Warning: There are no variables with a positive EVPI. You probably do not need
## a plot for that.
In this case there were no high value variables. We can be confident in supporting the decision, even with our imperfect current understanding.
Value of information for the garden option with formal STEM education.
# using the results of the same multi_EVPI
plot_evpi(evpi, decision_vars = "decision_STEM")
Value of information for the public school garden option with no formal STEM education.
# using the results of the same multi_EVPI
plot_evpi(evpi, decision_vars = "decision_garden_public_school")
Value of information for the public school garden option with formal STEM education.
# using the results of the same multi_EVPI
plot_evpi(evpi, decision_vars = "decision_garden_STEM_public_school")
This will be the cost for public and private schools over the intervention.
source("functions/plot_cashflow.R")
plot_cashflow(mcSimulation_object = garden_simulation_results,
cashflow_var_name = "Cashflow_garden")
Cashflow of the garden option with formal STEM education
source("functions/plot_cashflow.R")
plot_cashflow(mcSimulation_object = garden_simulation_results,
cashflow_var_name = "Cashflow_garden_STEM")
We use Projection to Latent Structures model to get some sense of the correlation strength and direction for model variables and our outcome variables.
For passive education garden option
source("functions/pls_model.R")
pls_result <- pls_model(object = garden_simulation_results,
resultName = names(garden_simulation_results$y)[1], # the "NPV_garden"
ncomp = 1)
# read in the common input table
input_table <- read.csv("inputs_school_garden.csv")
# source the plot function
source("functions/plot_pls.R")
plot_pls(pls_result, input_table = input_table, threshold = 0.9)
For school garden with formal STEM education
pls_result_STEM <- pls_model(object = garden_simulation_results,
resultName = names(garden_simulation_results$y)[2], # the "NPV_garden_STEM"
ncomp = 1)
plot_pls(pls_result_STEM, input_table = input_table, threshold = 0.9)
Here we provide a summary of the garden intervention options. We do
this with a summary table of the simulation results. We show the
percentage of missing values as well as the mean, median and standard
deviation (SD) for each output of our model simulations. We use the
gt_plt_summary() from {gtExtras} and with options from
{svglite}. The table shows the name, the plot overview as well as the
number of missing values, the mean, median and the standard deviation of
the distribution for all variables that were fed into the model from our
input table of uncertainty values.
# Subset the outputs from the mcSimulation function (y) to summarize only on the variables that we want.
# names(garden_simulation_results$x)
mcSimulation_table_x <- data.frame(garden_simulation_results$x[2:72]) #,
# names(garden_simulation_results$y)
gtExtras::gt_plt_summary(mcSimulation_table_x)
| mcSimulation_table_x | ||||||
| 1000 rows x 71 cols | ||||||
| Column | Plot Overview | Missing | Mean | Median | SD | |
|---|---|---|---|---|---|---|
| discount_rate | 0.0% | 5.5 | 5.4 | 1.5 | ||
| CV_value | 0.0% | 0.3 | 0.2 | 0.1 | ||
| inflation_rate | 0.0% | 7.5 | 7.6 | 1.5 | ||
| size_of_garden | 0.0% | 45.5 | 42.6 | 29.1 | ||
| expensive_garden_size | 0.0% | 87.4 | 87.4 | 4.5 | ||
| cost_increase_expensive_garden_size | 0.0% | 1.8 | 1.8 | 0.4 | ||
| if_students_like | 0.0% | 0.7 | 0.6 | 0.1 | ||
| if_parents_like | 0.0% | 0.7 | 0.7 | 0.1 | ||
| if_community_likes | 0.0% | 0.5 | 0.5 | 0.2 | ||
| if_effective_manage | 0.0% | 0.6 | 0.6 | 0.1 | ||
| if_garden_yield_enough | 0.0% | 0.6 | 0.6 | 0.2 | ||
| if_garden_healthy | 0.0% | 0.7 | 0.7 | 0.1 | ||
| if_teachers_like | 0.0% | 0.6 | 0.6 | 0.2 | ||
| if_effective_teaching | 0.0% | 0.6 | 0.6 | 0.2 | ||
| if_effective_training | 0.0% | 0.5 | 0.5 | 0.2 | ||
| if_offer_green_space | 0.0% | 0.7 | 0.7 | 0.1 | ||
| if_reduce_pollution | 0.0% | 0.3 | 0.3 | 0.1 | ||
| if_biophysical_good | 0.0% | 0.5 | 0.5 | 0.2 | ||
| if_animals_in_garden | 0.0% | 0.5 | 0.5 | 0.2 | ||
| equipment_cost | 0.0% | 12.9 | 12.9 | 4.1 | ||
| construction_cost | 0.0% | 58.8 | 53.4 | 39.1 | ||
| garden_designing_costs | 0.0% | 12.5 | 12.6 | 1.5 | ||
| teacher_training_cost | 0.0% | 12.3 | 12.1 | 4.5 | ||
| school_board_planning | 0.0% | 9.0 | 8.9 | 1.8 | ||
| teaching_equipment | 0.0% | 7.5 | 7.6 | 1.6 | ||
| compost_starting | 0.0% | 7.5 | 7.5 | 1.5 | ||
| worm_starting | 0.0% | 6.5 | 6.4 | 2.1 | ||
| livestock_establishment_costs | 0.0% | 15.0 | 14.8 | 6.4 | ||
| fishpond_cost | 0.0% | 8.5 | 8.5 | 0.9 | ||
| if_family_pays_establishment | 0.0% | 0.4 | 0.4 | 0.1 | ||
| establishment_family_portion_paid | 0.0% | 0.5 | 0.5 | 0.2 | ||
| maintaining_labor | 0.0% | 32.6 | 32.6 | 4.6 | ||
| teacher_salary_cost | 0.0% | 25.1 | 25.1 | 3.1 | ||
| teaching_equipment_annual | 0.0% | 15.3 | 11.7 | 12.9 | ||
| teaching_tools | 0.0% | 5.9 | 5.9 | 2.4 | ||
| seed_costs | 0.0% | 12.3 | 12.2 | 4.6 | ||
| fertilizer | 0.0% | 1.5 | 1.5 | 0.3 | ||
| plant_protection | 0.0% | 3.5 | 3.5 | 0.9 | ||
| livestock_maint | 0.0% | 6.0 | 6.1 | 2.5 | ||
| annual_teacher_training | 0.0% | 96.0 | 67.4 | 96.2 | ||
| if_school_has_canteen | 0.0% | 0.3 | 0.3 | 0.1 | ||
| canteen_savings | 0.0% | 3.0 | 3.0 | 1.2 | ||
| sale_of_yield | 0.0% | 20.3 | 20.2 | 6.2 | ||
| extra_cirricular_savings | 0.0% | 59.3 | 59.4 | 23.9 | ||
| formal_edu_savings | 0.0% | 2.0 | 2.0 | 0.6 | ||
| formal_edu_savings_STEM | 0.0% | 58.1 | 57.2 | 23.9 | ||
| outside_investment_value | 0.0% | 3.0 | 3.0 | 1.2 | ||
| outside_investment_value_STEM | 0.0% | 4.4 | 4.3 | 2.1 | ||
| increased_enrollment_value | 0.0% | 1.8 | 1.3 | 1.6 | ||
| increased_enrollment_value_STEM | 0.0% | 52.4 | 51.5 | 27.8 | ||
| child_veg_health_care_savings | 0.0% | 1.8 | 1.3 | 1.6 | ||
| child_veg_school_performance_value | 0.0% | 0.1 | 0.1 | 0.1 | ||
| child_veg_community_engagement_value | 0.0% | 0.1 | 0.1 | 0.0 | ||
| garden_mental_health_value | 0.0% | 103.7 | 70.7 | 97.5 | ||
| child_garden_health_care_savings | 0.0% | 169.9 | 115.2 | 168.2 | ||
| child_garden_school_performance_value | 0.0% | 95.8 | 91.5 | 48.6 | ||
| child_garden_community_engagement_value | 0.0% | 5.0 | 5.0 | 1.2 | ||
| child_STEM_health_care_savings | 0.0% | 49.4 | 49.4 | 17.8 | ||
| child_STEM_school_performance_value | 0.0% | 35.6 | 26.6 | 31.8 | ||
| child_STEM_community_engagement_value | 0.0% | 106.3 | 93.4 | 73.0 | ||
| green_space_value | 0.0% | 5.1 | 4.9 | 2.7 | ||
| reduce_pollution_value | 0.0% | 2.0 | 2.0 | 0.6 | ||
| school_event_value | 0.0% | 91.1 | 83.5 | 58.0 | ||
| school_event_freq | 0.0% | 6.5 | 6.4 | 2.2 | ||
| value_of_non_garden_land_use | 0.0% | 34.6 | 34.5 | 9.0 | ||
| if_parking | 0.0% | 0.4 | 0.4 | 0.2 | ||
| parking_value | 0.0% | 1.2 | 1.1 | 0.9 | ||
| costs_of_non_garden_land_use | 0.0% | 3.0 | 3.0 | 1.2 | ||
| land_access | 0.0% | 0.8 | 0.8 | 0.1 | ||
| suitability_of_land_for_garden | 0.0% | 0.8 | 0.8 | 0.1 | ||
| beurocratic_barriers | 0.0% | 0.2 | 0.1 | 0.2 | ||
# a summary table with missing, mean, median and sd
The full repository can be accessed at https://github.com/CWWhitney/nifam_codas_school_garden with the following QR code.